#include<bits/stdc++.h>
using namespace std;
struct node
{
	int len,num[5000];
	void clear()
	{
		len=0;
		memset(num,0,sizeof(num));
	}
	int operator[](int x)const
	{
		return num[x];
	}
	int &operator[](int x)
	{
		return num[x];
	}
	node operator+(const node b)const
	{
		node ret;
		ret.clear();
		ret.len=max(len,b.len);
		for(int i=1;i<=ret.len;++i)
		{
			ret[i]=ret[i]+num[i]+b[i];
			if(ret[i]>=10000)
			{
				ret[i+1]=ret[i]/10000;
				ret[i]=ret[i]%10000;
			}
		}
		if(ret[ret.len+1])++ret.len;
		return ret;
	}
	node operator-(const node b)const
	{
		node ret;
		ret.clear();
		ret.len=len;
		for(int i=1;i<=len;++i)
		{
			ret[i]=ret[i]+num[i]-b[i];
			if(ret[i]<0)
			{
				ret[i+1]=ret[i+1]-1;
				ret[i]=ret[i]+10000;
			}
		}
		if(!ret[ret.len])--ret.len;
		return ret;
	}
	node operator*(const node b)const
	{
		node ret;
		ret.clear();
		for(int i=1;i<=len;++i)
		{
			for(int j=1;j<=b.len;++j)
			{
				ret[i+j-1]=ret[i+j-1]+num[i]*b[j];
				if(ret[i+j-1]>=10000)
				{
					ret[i+j]=ret[i+j]+ret[i+j-1]/10000;
					ret[i+j-1]=ret[i+j-1]%10000;
				}
			}
		}
		ret.len=len+b.len-1;
		while(ret[ret.len]!=0)
		{
			if(ret[ret.len]>=10000)
			{
				ret[ret.len+1]=ret[ret.len]/10000;
				ret[ret.len]=ret[ret.len]%10000;
			}
			++ret.len;
		}
		--ret.len;
		return ret;
	}
	void print()
	{
		printf("%d",num[len]);
		for(int i=len-1;i;--i)printf("%04d",num[i]);
		printf("\n");
	}
	node qpow(const int n)const
	{
		node ans,a;
		int b=n;
		ans.clear();
		memcpy(a.num,num,sizeof(num));
		a.len=len;
		ans.len=1;
		ans[1]=1;
		for(;b;b>>=1,a=a*a)
			if(b&1)ans=ans*a;
		return ans;
	}
};
int main()
{
	int n,d;
	scanf("%d%d",&n,&d);
	if(!d)
	{
		printf("1\n");
		return 0;
	}
	node f[40];
	f[0].clear();
	f[0].len=1;
	f[0][1]=1;
	for(int i=1;i<=d;++i)
	{
		f[i].clear();
		f[i]=f[i-1].qpow(n);
		f[i]=f[i]+((node){1,{0,1}});
	}
	node ans=f[d]-f[d-1];
	ans.print();
	return 0;
}
